package config

import (
	"os"
	"sync"

	"gopkg.in/yaml.v3"
)

type Config struct {
	Server struct {
		Port int `yaml:"port"`
	} `yaml:"server"`
	Java struct {
		Path string `yaml:"path"`
		Jar  string `yaml:"jar"`
	} `yaml:"java"`

	// 添加统计相关配置
	Statistics struct {
		TrackUpload int64 `yaml:"trackUpload"` // 是否跟踪上传功能
		TrackParse  int64 `yaml:"trackParse"`  // 是否跟踪解析功能
	} `yaml:"statistics"`
}

// var Cfg Config

// func LoadConfig(path string) error {
// 	data, err := os.ReadFile(path)
// 	if err != nil {
// 		return err
// 	}
// 	return yaml.Unmarshal(data, &Cfg)
// }

var (
	Cfg         Config
	configPath  string       // 保存配置文件路径
	configMutex sync.RWMutex // 用于保护配置读取和修改的互斥锁
)

// LoadConfig 加载配置文件并保存路径
func LoadConfig(path string) error {
	configMutex.Lock()
	defer configMutex.Unlock()

	// 保存配置文件路径
	configPath = path

	// 加载配置
	data, err := os.ReadFile(path)
	if err != nil {
		return err
	}
	return yaml.Unmarshal(data, &Cfg)
}

// ReloadConfig 重新加载配置文件
func ReloadConfig() error {
	configMutex.Lock()
	defer configMutex.Unlock()

	// 检查配置路径是否已设置
	if configPath == "" {
		return nil
	}

	// 重新加载配置
	data, err := os.ReadFile(configPath)
	if err != nil {
		return err
	}
	return yaml.Unmarshal(data, &Cfg)
}

// GetConfig 获取当前配置的只读副本
func GetConfig() Config {
	configMutex.RLock()
	defer configMutex.RUnlock()
	return Cfg
}

// SaveConfig 将当前配置保存到文件
func SaveConfig() error {
	configMutex.RLock()
	defer configMutex.RUnlock()

	// 检查配置路径是否已设置
	if configPath == "" {
		return nil
	}

	// 将配置序列化为YAML
	data, err := yaml.Marshal(&Cfg)
	if err != nil {
		return err
	}

	// 写入文件
	return os.WriteFile(configPath, data, 0o644)
}
